This file contains statistics and figures from the paper, “Molecular,
Cellular, and Developmental Organization of the Mouse Vomeronasal organ
at Single Cell Resolution” by Max Hills Jr., Limei Ma, Ai Fang, Thelma
Chiremba, Seth Malloy, Allison Scott, Anoja Perera, and C. Ron Yu.
The paper can be found here:
Molecular,
Cellular, and Developmental Organization of the Mouse Vomeronasal organ
at Single Cell Resolution
Novel neuronal lineage
UMAP visualization of cell-type clusters for the neuronal
lineage

How many mature neurons are OSNs?
all_mature_neurons <- c("V1R_mVSN","V2R_mVSN","mOSN","sVSN")
table(neuron.integrated@active.ident)[c("mOSN")]/sum(table(neuron.integrated@active.ident)[all_mature_neurons])
mOSN
0.02236955
Normalized Gap43 and Stmn2 expression in the neuronal lineage
In all lineages the cells can be distinguished to have both immature
and mature populations, as determined by the expression of Gap43 and
Stmn2 genes (Fig. S1).

Normalized Xist expression in the neuronal lineage, split by
sex

Expression of Gnai2 and Gnao1 in the neuronal lineage

Violin plot of normalized Gnai2 expression in mature V2R neurons,
split by sample

Expression of Cnga2 and Gnal in the OSN lineage

Location of mOSNs

Total number of genes, counts, and percent ribosomal gene expression
detected in mature neurons, split by cell type

Location of sVSNs in a VNO slice

Heatmap of normalized expression for a select set of mutually
differentially expressed genes between sVSNs and mature V1Rs, V2Rs, and
OSNs

Heatmap of 503 significant (padj ≤ 0.001, fold-change ≥ 1.5)
differentially expressed genes in sVSNs
[1] "sVSN Significant Upregulated Genes"
[1] 97
[1] "sVSN Significant Downregulated Genes"
[1] 406

Enriched gene ontology (GO) terms in sVSNs when compared with V1R
and V2R VSNs, respectively

Box plots of normalized expression for Muc2, Obp2a, Obp2b, and Lcn3
across mature sensory neurons

Significantly regulated genes in sVSNs
The sVSNs are distinctive from the mature VSNs by a higher expression
of P2ry14, Ap1s3, Cspp1, and lower expression of Omp, Tuba1a, and Ptma
(Fig. 2f and S6).

LS0tCnRpdGxlOiAiVk5PIEF0bGFzIEZpZ3VyZSAyIgphdXRob3I6ICJNYXggSGlsbHMiCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkICVCLCAlWScpYCIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKPlRoaXMgZmlsZSBjb250YWlucyBzdGF0aXN0aWNzIGFuZCBmaWd1cmVzIGZyb20gdGhlIHBhcGVyLCAiTW9sZWN1bGFyLCBDZWxsdWxhciwgYW5kIERldmVsb3BtZW50YWwgT3JnYW5pemF0aW9uIG9mIHRoZSBNb3VzZSBWb21lcm9uYXNhbCBvcmdhbiBhdCBTaW5nbGUgQ2VsbCBSZXNvbHV0aW9uIiBieSBNYXggSGlsbHMgSnIuLCBMaW1laSBNYSwgQWkgRmFuZywgVGhlbG1hIENoaXJlbWJhLCBTZXRoIE1hbGxveSwgQWxsaXNvbiBTY290dCwgQW5vamEgUGVyZXJhLCBhbmQgQy4gUm9uIFl1LiAgICAKClRoZSBwYXBlciBjYW4gYmUgZm91bmQgaGVyZTogIAoKW01vbGVjdWxhciwgQ2VsbHVsYXIsIGFuZCBEZXZlbG9wbWVudGFsIE9yZ2FuaXphdGlvbiBvZiB0aGUgTW91c2UgVm9tZXJvbmFzYWwgb3JnYW4gYXQgU2luZ2xlIENlbGwgUmVzb2x1dGlvbl0oaHR0cHM6Ly9lbGlmZXNjaWVuY2VzLm9yZy9yZXZpZXdlZC1wcmVwcmludHMvOTczNTYjdGFiLWNvbnRlbnQpCgoqKiogIAoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CgojIFItTWFya2Rvd24gR2xvYmFsIFNldHRpbmdzICAKCiMgU2V0LXVwIGEgZGVmYXVsdCBpbWFnZSBzaXplIG9mIDEwIFggMTAgaW5jaGVzLiBTdXBwcmVzcyB3YXJuaW5nCiMgYW5kIGVycm9yIG1lc3NhZ2VzLiBIaWRlIGNvZGUuCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBjb21tZW50PSIiLAogICAgICAgICAgICAgICAgICAgICAgZXJyb3I9RkFMU0UsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD0xMCwgY2FjaGU9RkFMU0UpCgpgYGAKCmBgYHtyIGxpYnJhcmllcywgaW5jbHVkZT1GQUxTRX0KCiMgTGlicmFyeSBMb2FkaW5nICAKCnN1cHByZXNzUGFja2FnZVN0YXJ0dXBNZXNzYWdlcyh7CiAgbGlicmFyeShraXQpOyBsaWJyYXJ5KHRpZHl2ZXJzZSk7IGxpYnJhcnkoc3RyaW5ncik7IGxpYnJhcnkocGxvdDNEKSAKICBsaWJyYXJ5KGdncGxvdDIpOyBsaWJyYXJ5KGRhdGEudGFibGUpOyBsaWJyYXJ5KG9yZy5NbS5lZy5kYikKICBsaWJyYXJ5KGRwbHlyKTsgbGlicmFyeShTZXVyYXQpOyBsaWJyYXJ5KERCSSk7IGxpYnJhcnkoY293cGxvdCkKICBsaWJyYXJ5KE1hdHJpeCk7IGxpYnJhcnkoZ2xtR2FtUG9pKTsgbGlicmFyeShjaXJjbGl6ZSkKICBsaWJyYXJ5KHRpYmJsZSk7IGxpYnJhcnkoZ2dwdWJyKTsgbGlicmFyeShzdmdsaXRlKTsgbGlicmFyeShnZ3NpZ25pZikKICBsaWJyYXJ5KHN0YXRzKTsgbGlicmFyeSh2ZWdhbik7IGxpYnJhcnkoc2NhbGVzKTsgbGlicmFyeShjYXJldCkKICBsaWJyYXJ5KHBhdGNod29yayk7IGxpYnJhcnkocGxvdGx5KTsgbGlicmFyeShnZW9tdGV4dHBhdGgpCiAgbGlicmFyeShvcGVueGxzeCk7IGxpYnJhcnkoZ3JpZEV4dHJhKTsgbGlicmFyeShnZ3JlcGVsKQogIGxpYnJhcnkoR2VuZU92ZXJsYXApOyBsaWJyYXJ5KGJpb21hUnQpOyBsaWJyYXJ5KGdncG9pbnRkZW5zaXR5KQogIGxpYnJhcnkoc2xpbmdzaG90KTsgbGlicmFyeSh0cmFkZVNlcSk7IGxpYnJhcnkoU2luZ2xlQ2VsbEV4cGVyaW1lbnQpCiAgbGlicmFyeSh2aXJpZGlzKTsgbGlicmFyeShVcFNldFIpOyBsaWJyYXJ5KHBoZWF0bWFwKTsgbGlicmFyeShtc2lnZGJyKQogIGxpYnJhcnkoZmdzZWEpOyBsaWJyYXJ5KGdyaWQpOyBsaWJyYXJ5KElEUG1pc2MpOyBsaWJyYXJ5KE1BU1MpCiAgbGlicmFyeShSbWlzYyk7IGxpYnJhcnkoZ2dwbG90aWZ5KTsgbGlicmFyeShnZ3BtaXNjKTsgbGlicmFyeShzY2FsZXMpCiAgbGlicmFyeShoZWF0bWFwbHkpOyBsaWJyYXJ5KGRlbmRleHRlbmQpCn0pCgpgYGAKCmBgYHtyfQoKIyBHbG9iYWwgVmFyaWFibGVzCgojIFRoZSBob21lIGRpcmVjdG9yeQpob21lX2RpciA8LSAiL2wvWXUvWXVMYWIvQmlvaW5mb3JtYXRpY3MvcHJvamVjdHMvbWhoL3NjX1ZOTy8iCiMgRGlyZWN0b3J5IGZvciBzdG9yaW5nIGRhdGEgb2JqZWN0cyBhdCBjcnVjaWFsIHN0YWdlcwpvYmplY3RfZGlyIDwtIHBhc3RlMChob21lX2RpciwiZmluYWwuc2V1Lm9ianMvIikKIyBEaXJlY3RvcnkgZm9yIGltYWdlcyBmcm9tIHRoZSBmaW5hbCBhbmFseXNpcwppbWFnZV9kaXIgPC0gcGFzdGUwKGhvbWVfZGlyLCJmaW5hbF9pbWFnZXMvIikKYWRvYmVfaW1hZ2VzIDwtIHBhc3RlMChpbWFnZV9kaXIsICJhZG9iZV9pbGx1c3RyYXRvcl9zdmdfZmlsZXMvIikKIyBEaXJlY3RvcnkgZm9yIGltYWdlcyBmb3IgdGhlIGZpbmFsIHBhcGVyCmNsdXN0cmVlX2RpciA8LSBwYXN0ZTAoaW1hZ2VfZGlyLCJjbHVzdHJlZS8iKQojIEEgZGlyZWN0b3J5IGZvciBUcmFkZVNlcSBmaXRHQU0gb3V0cHV0CmZpdEdBTV9kaXIgPC0gcGFzdGUwKG9iamVjdF9kaXIsICJmaXRHQU0vIikKbW9lX2RpciA8LSAiL2wvWXUvWXVMYWIvQmlvaW5mb3JtYXRpY3MvcHJvamVjdHMvbWhoL21vbG5nXzI0MDdfMjQ1My9SX29iai8iCgojIE9QRU4gYGBgdm5vLnNldS5pbnRlZ3JhdGVkYGBgCmxvYWQoZmlsZSA9IHBhc3RlMChvYmplY3RfZGlyLCJ2bm8uaW50ZWdyYXRlZC5wb3N0Q2VsbElEIikpCiNMb2FkIE5ldXJvbmFsIExpbmVhZ2UgU2V1cmF0IE9iamVjdCAgCmxvYWQoZmlsZSA9IHBhc3RlMChvYmplY3RfZGlyLCJuZXVyb24uaW50ZWdyYXRlZC5wb3N0Q2VsbElEIikpCgojIFJlbmFtZSB1bmtub3duX21WU04gdG8gc1ZTTgpsZXZlbHModm5vLnNldS5pbnRlZ3JhdGVkQGFjdGl2ZS5pZGVudClbbGV2ZWxzKHZuby5zZXUuaW50ZWdyYXRlZEBhY3RpdmUuaWRlbnQpPT0idW5rbm93bl9tVlNOIl0gPC0gInNWU04iCmxldmVscyhuZXVyb24uaW50ZWdyYXRlZEBhY3RpdmUuaWRlbnQpW2xldmVscyhuZXVyb24uaW50ZWdyYXRlZEBhY3RpdmUuaWRlbnQpPT0idW5rbm93bl9tVlNOIl0gPC0gInNWU04iCmxldmVscyh2bm8uc2V1LmludGVncmF0ZWQkY2VsbF90eXBlKVtsZXZlbHModm5vLnNldS5pbnRlZ3JhdGVkJGNlbGxfdHlwZSk9PSJ1bmtub3duX21WU04iXSA8LSAic1ZTTiIKbGV2ZWxzKG5ldXJvbi5pbnRlZ3JhdGVkJGNlbGxfdHlwZSlbbGV2ZWxzKG5ldXJvbi5pbnRlZ3JhdGVkJGNlbGxfdHlwZSk9PSJ1bmtub3duX21WU04iXSA8LSAic1ZTTiIKCiMgR2V0IGNvbG9yIHNjaGVtZSBmb3IgdGhlIHdob2xlIHZubyBkYXRhc2V0CnZuby5jZWxsX3R5cGUuY29sb3JzIDwtIGh1ZV9wYWwoKShsZW5ndGgobGV2ZWxzKHZuby5zZXUuaW50ZWdyYXRlZEBhY3RpdmUuaWRlbnQpKSkKbmFtZXModm5vLmNlbGxfdHlwZS5jb2xvcnMpIDwtIGxldmVscyh2bm8uc2V1LmludGVncmF0ZWRAYWN0aXZlLmlkZW50KQoKIyBLZWVwIG5ldXJvbiBkYXRhc2V0IGNvbG9yIHNjaGVtZSBjb25zaXN0ZW50IHdpdGggdGhlIHdob2xlIHZubyBjb2xvciBzY2hlbWUsIHdoZXJlIHBvc3NpYmxlICAKbmV1cm9uLmNlbGxfdHlwZS5jb2xvcnMgPC0gdm5vLmNlbGxfdHlwZS5jb2xvcnNbYygiVjFSX21WU04iLCJWMlJfbVZTTiIsIm1PU04iLCJzVlNOIiwiVjFSX2lWU04iLCJWMlJfaVZTTiIsIkdCQyIpXQpuZXVyb24uY2VsbF90eXBlLmNvbG9ycyA8LSBzZXROYW1lcyhjKG5ldXJvbi5jZWxsX3R5cGUuY29sb3JzLCIjMDBCMEY2IiwiIzk1OTBGRiIsIiNFNzZCRjMiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyhuYW1lcyhuZXVyb24uY2VsbF90eXBlLmNvbG9ycyksImlPU04iLCJsYXRlX0lOUCIsImVhcmx5X0lOUCIpKQoKbWF0dXJlLm5ldXJvbnMgPC0gc3Vic2V0KG5ldXJvbi5pbnRlZ3JhdGVkLGlkZW50cz1jKCJWMVJfbVZTTiIsIlYyUl9tVlNOIiwibU9TTiIsInNWU04iKSkKbWF0dXJlLmNlbGxfdHlwZS5jb2xvcnMgPC0gbmV1cm9uLmNlbGxfdHlwZS5jb2xvcnNbYygiVjFSX21WU04iLCJWMlJfbVZTTiIsIm1PU04iLCJzVlNOIildCgpnbG9iYWwudmFycyA8LSBjKGxzKCksImdsb2JhbC52YXJzIikKCmBgYAoKKioqICAKCiMgTm92ZWwgbmV1cm9uYWwgbGluZWFnZSB7LnRhYnNldCAudGFic2V0LXBpbGxzfSAgCgpgYGB7ciwgaW5jbHVkZT1GQUxTRX0KCiMgRGlmZmVyZW50aWFsIEV4cHJlc3Npb24gb2YgR2VuZXMgQWNyb3NzIENlbGwtVHlwZXMKVjFSX2lWU05fVjJSX2lWU04uREVHcyA8LSAKICByZWFkLnhsc3goeGxzeEZpbGUgPSBwYXN0ZTAob2JqZWN0X2RpciwiVjFSX2lWU05fVjJSX2lWU04uREVHcy54bHN4Iikscm93TmFtZXM9VFJVRSkKVjFSX2lWU05faU9TTi5ERUdzIDwtIAogIHJlYWQueGxzeCh4bHN4RmlsZSA9IHBhc3RlMChvYmplY3RfZGlyLCJWMVJfaVZTTl9pT1NOLkRFR3MueGxzeCIpLHJvd05hbWVzPVRSVUUpClYyUl9pVlNOX2lPU04uREVHcyA8LSAKICByZWFkLnhsc3goeGxzeEZpbGUgPSBwYXN0ZTAob2JqZWN0X2RpciwiVjJSX2lWU05faU9TTi5ERUdzLnhsc3giKSxyb3dOYW1lcz1UUlVFKQpWMVJfbVZTTl9WMlJfbVZTTi5ERUdzIDwtIAogIHJlYWQueGxzeCh4bHN4RmlsZSA9IHBhc3RlMChvYmplY3RfZGlyLCJWMVJfbVZTTl9WMlJfbVZTTi5ERUdzLnhsc3giKSxyb3dOYW1lcz1UUlVFKQpWMVJfaVZTTl9sYXRlX0lOUC5ERUdzIDwtIAogIHJlYWQueGxzeCh4bHN4RmlsZSA9IHBhc3RlMChvYmplY3RfZGlyLCJWMVJfaVZTTl9sYXRlX0lOUC5ERUdzLnhsc3giKSxyb3dOYW1lcz1UUlVFKQpWMlJfaVZTTl9sYXRlX0lOUC5ERUdzIDwtIAogIHJlYWQueGxzeCh4bHN4RmlsZSA9IHBhc3RlMChvYmplY3RfZGlyLCJWMlJfaVZTTl9sYXRlX0lOUC5ERUdzLnhsc3giKSxyb3dOYW1lcz1UUlVFKQp1bmtub3duX21WU05fVjFSX21WU04uREVHcyA8LSAKICByZWFkLnhsc3goeGxzeEZpbGUgPSBwYXN0ZTAob2JqZWN0X2RpciwidW5rbm93bl9tVlNOX1YxUl9tVlNOLkRFR3MueGxzeCIpLHJvd05hbWVzPVRSVUUpCnVua25vd25fbVZTTl9WMlJfbVZTTi5ERUdzIDwtIAogIHJlYWQueGxzeCh4bHN4RmlsZSA9IHBhc3RlMChvYmplY3RfZGlyLCJ1bmtub3duX21WU05fVjJSX21WU04uREVHcy54bHN4Iikscm93TmFtZXM9VFJVRSkKdW5rbm93bl9tVlNOX21PU04uREVHcyA8LSAKICByZWFkLnhsc3goeGxzeEZpbGUgPSBwYXN0ZTAob2JqZWN0X2RpciwidW5rbm93bl9tVlNOX21PU04uREVHcy54bHN4Iikscm93TmFtZXM9VFJVRSkKCiMgR2VuZS1zZXQgRW5yaWNobWVudCBBbmFseXNpcyBvZiBHTyBUZXJtcyBmb3IgVW5rbm93biBtVlNOcyB2cyBPdGhlciBOZXVyb24gVHlwZXMKdW5rbm93bl9tVlNOX1YxUl9tVlNOLkJQLnJlcyA8LSAKICBvcGVueGxzeDo6cmVhZC54bHN4KHhsc3hGaWxlPXBhc3RlMChvYmplY3RfZGlyLCJ1bmtub3duX21WU05fVjFSX21WU04uQlAucmVzLnhsc3giKSxyb3dOYW1lcz1UUlVFKQp1bmtub3duX21WU05fVjJSX21WU04uQlAucmVzIDwtIAogIG9wZW54bHN4OjpyZWFkLnhsc3goeGxzeEZpbGU9cGFzdGUwKG9iamVjdF9kaXIsInVua25vd25fbVZTTl9WMlJfbVZTTi5CUC5yZXMueGxzeCIpLHJvd05hbWVzPVRSVUUpCnVua25vd25fbVZTTl9WMVJfbVZTTi5NRi5yZXMgPC0gCiAgb3Blbnhsc3g6OnJlYWQueGxzeCh4bHN4RmlsZT1wYXN0ZTAob2JqZWN0X2RpciwidW5rbm93bl9tVlNOX1YxUl9tVlNOLk1GLnJlcy54bHN4Iikscm93TmFtZXM9VFJVRSkKdW5rbm93bl9tVlNOX1YyUl9tVlNOLk1GLnJlcyA8LSAKICBvcGVueGxzeDo6cmVhZC54bHN4KHhsc3hGaWxlPXBhc3RlMChvYmplY3RfZGlyLCJ1bmtub3duX21WU05fVjJSX21WU04uTUYucmVzLnhsc3giKSxyb3dOYW1lcz1UUlVFKQp1bmtub3duX21WU05fVjFSX21WU04uQ0MucmVzIDwtIAogIG9wZW54bHN4OjpyZWFkLnhsc3goeGxzeEZpbGU9cGFzdGUwKG9iamVjdF9kaXIsInVua25vd25fbVZTTl9WMVJfbVZTTi5DQy5yZXMueGxzeCIpLHJvd05hbWVzPVRSVUUpCnVua25vd25fbVZTTl9WMlJfbVZTTi5DQy5yZXMgPC0gCiAgb3Blbnhsc3g6OnJlYWQueGxzeCh4bHN4RmlsZT1wYXN0ZTAob2JqZWN0X2RpciwidW5rbm93bl9tVlNOX1YyUl9tVlNOLkNDLnJlcy54bHN4Iikscm93TmFtZXM9VFJVRSkKCmxvYWQoZmlsZT1wYXN0ZTAob2JqZWN0X2RpciwicmVzb2x2ZS5kYXRhc2V0cy5QT1NUcHJlZGljdCIpKQpsb2FkKGZpbGU9cGFzdGUwKG9iamVjdF9kaXIsInJlc29sdmUucHJlZGljdGlvbnMuYXNzYXkiKSkKCmBgYAoKIyMgVU1BUCB2aXN1YWxpemF0aW9uIG9mIGNlbGwtdHlwZSBjbHVzdGVycyBmb3IgdGhlIG5ldXJvbmFsIGxpbmVhZ2UgIAoKYGBge3J9CgpmaWcyX2EgPC0gRGltUGxvdChuZXVyb24uaW50ZWdyYXRlZCwgcmVkdWN0aW9uPSJ1bWFwIiwgbGFiZWw9VFJVRSwgc2h1ZmZsZT1UUlVFLCBjb2xzPW5ldXJvbi5jZWxsX3R5cGUuY29sb3JzKSArCiAgZ2d0aXRsZSgiTmV1cm9uYWwgTGluZWFnZSIpICsgTm9MZWdlbmQoKSArCiAgdGhlbWUoYXNwZWN0LnJhdGlvPTEpCgpzdmdsaXRlKGZpbGVuYW1lID0gcGFzdGUwKGFkb2JlX2ltYWdlcywiZmlnMl9hLnN2ZyIpLCB3aWR0aD0xMCwgaGVpZ2h0PTEwKQpmaWcyX2EKaW52aXNpYmxlKGRldi5vZmYoKSkKZmlnMl9hCgpgYGAKCj5Ib3cgbWFueSBtYXR1cmUgbmV1cm9ucyBhcmUgT1NOcz8gIAoKYGBge3IsIGVjaG89VFJVRX0KCmFsbF9tYXR1cmVfbmV1cm9ucyA8LSBjKCJWMVJfbVZTTiIsIlYyUl9tVlNOIiwibU9TTiIsInNWU04iKQp0YWJsZShuZXVyb24uaW50ZWdyYXRlZEBhY3RpdmUuaWRlbnQpW2MoIm1PU04iKV0vc3VtKHRhYmxlKG5ldXJvbi5pbnRlZ3JhdGVkQGFjdGl2ZS5pZGVudClbYWxsX21hdHVyZV9uZXVyb25zXSkKCmBgYAoKYGBge3J9CgpTMV90aGVtZSA8LSB0aGVtZShwbG90LnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTMyKSwKICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0yNCksCiAgICAgICAgICAgICAgICAgIGF4aXMudGV4dCA9ZWxlbWVudF90ZXh0KHNpemU9MjApLAogICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0yMCksCiAgICAgICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbj0icmlnaHQiLAogICAgICAgICAgICAgICAgICBhc3BlY3QucmF0aW89MSwKICAgICAgICAgICAgICAgICAgcGxvdC5tYXJnaW49dW5pdChjKC0xLDAuMjUsLTEsMC4yNSksImxpbmVzIiksCiAgICAgICAgICAgICAgICAgIHBhbmVsLnNwYWNpbmc9dW5pdCgwLCAibGluZXMiKSkKCmBgYAoKIyMgTm9ybWFsaXplZCBHYXA0MyBhbmQgU3RtbjIgZXhwcmVzc2lvbiBpbiB0aGUgbmV1cm9uYWwgbGluZWFnZSAgCgo+SW4gYWxsIGxpbmVhZ2VzIHRoZSBjZWxscyBjYW4gYmUgZGlzdGluZ3Vpc2hlZCB0byBoYXZlIGJvdGggaW1tYXR1cmUgYW5kIG1hdHVyZSBwb3B1bGF0aW9ucywgYXMgZGV0ZXJtaW5lZCBieSB0aGUgZXhwcmVzc2lvbiBvZiBHYXA0MyBhbmQgU3RtbjIgZ2VuZXMgKEZpZy4gUzEpLiAgCgpgYGB7ciwgZmlnLndpZHRoPTE1LGZpZy5oZWlnaHQ9Ny41fQoKZmlnU18xQUIgPC0gRmVhdHVyZVBsb3Qob2JqZWN0PW5ldXJvbi5pbnRlZ3JhdGVkLCBmZWF0dXJlcz1jKCJHYXA0MyIsIlN0bW4yIiksIG9yZGVyPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgICBjb2xzPWMoImN5YW4iLCJtYWdlbnRhIiksa2VlcC5zY2FsZT0nYWxsJykgJiBTMV90aGVtZQoKZmlnU18xQUIKCmBgYAoKIyMgTm9ybWFsaXplZCBYaXN0IGV4cHJlc3Npb24gaW4gdGhlIG5ldXJvbmFsIGxpbmVhZ2UsIHNwbGl0IGJ5IHNleCAgCgpgYGB7cixmaWcud2lkdGg9MTUsZmlnLmhlaWdodD03LjV9CgpmaWdTXzFDIDwtIEZlYXR1cmVQbG90KG9iamVjdD1uZXVyb24uaW50ZWdyYXRlZCxmZWF0dXJlcz0iWGlzdCIsb3JkZXI9VFJVRSwKICAgICAgICAgICAgY29scz1jKCJjeWFuIiwibWFnZW50YSIpLHNwbGl0LmJ5PSJzZXgiLGtlZXAuc2NhbGU9J2FsbCcpICYgUzFfdGhlbWUgJgogIHRoZW1lKGF4aXMudGl0bGUueT1lbGVtZW50X2JsYW5rKCkpCgpmaWdTXzFDCgpgYGAKCiMjIEV4cHJlc3Npb24gb2YgR25haTIgYW5kIEduYW8xIGluIHRoZSBuZXVyb25hbCBsaW5lYWdlICAKCmBgYHtyLCBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9NH0KCmZpZzJfYiA8LSBGZWF0dXJlUGxvdChuZXVyb24uaW50ZWdyYXRlZCwgZmVhdHVyZXM9YygiR25haTIiLCJHbmFvMSIpLCBvcmRlcj1UUlVFLCBibGVuZD1UUlVFKSArCiAgdGhlbWUoYXNwZWN0LnJhdGlvPTEpCgpzdmdsaXRlKGZpbGVuYW1lID0gcGFzdGUwKGFkb2JlX2ltYWdlcywiZmlnMl9iLnN2ZyIpLHdpZHRoPTE2LCBoZWlnaHQ9NCkKZmlnMl9iCmludmlzaWJsZShkZXYub2ZmKCkpCgpmaWcyX2IKCmBgYAoKIyMgVmlvbGluIHBsb3Qgb2Ygbm9ybWFsaXplZCBHbmFpMiBleHByZXNzaW9uIGluIG1hdHVyZSBWMlIgbmV1cm9ucywgc3BsaXQgYnkgc2FtcGxlICAKCmBgYHtyfQoKIyBHZXQgZGF0YWZyYW1lIGZvciBwbG90dGluZyBmZWF0dXJlcyBvZiBzVlNOcwpzVlNOLmNvbXBhcmUuZGYgPC0gRmV0Y2hEYXRhKG1hdHVyZS5uZXVyb25zLHZhcnM9YygiY2VsbF90eXBlIiwibkZlYXR1cmVfUk5BIiwibkNvdW50X1JOQSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwZXJjZW50LnJpYm8iLCJQMnJ5MTQiLCJBcDFzMyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDc3BwMSIsIk11YzIiLCJPYnAyYSIsIk9icDJiIiwiTGNuMyIsIyMgVXAtcmVndWxhdGVkIGdlbmVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPbXAiLCJUdWJhMWEiLCJQdG1hIikpICAgICAgICAgICAgICAgIyMgRG93bi1yZWd1bGF0ZWQgZ2VuZXMKCm15X2NvbXBhcmlzb25zID0gbGlzdChjKCJWMVJfbVZTTiIsIlYyUl9tVlNOIiksYygiVjJSX21WU04iLCJtT1NOIiksYygibU9TTiIsInNWU04iKSwKICAgICAgICAgICAgICAgICAgICAgIGMoIlYxUl9tVlNOIiwibU9TTiIpLGMoIlYyUl9tVlNOIiwic1ZTTiIpLGMoIlYxUl9tVlNOIiwic1ZTTiIpKQoKbXlfdGhlbWUgPC0gdGhlbWUocGxvdC50aXRsZT1lbGVtZW50X3RleHQoaGp1c3Q9MC41LHNpemU9MzIsZmFjZT0nYm9sZCcpLCAjIENlbnRlciB0aGUgdGl0bGUKICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS55PWVsZW1lbnRfdGV4dChzaXplPTI0KSwKICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9MjApLAogICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICAgICBheGlzLnRpY2tzLng9ZWxlbWVudF9ibGFuaygpLCAKICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF9ibGFuaygpLGFzcGVjdC5yYXRpbz0xLAogICAgICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb249InJpZ2h0IiwKICAgICAgICAgICAgICAgICAgbGVnZW5kLmtleS5zaXplPXVuaXQoOCwnbW0nKSwKICAgICAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlLmFsaWduPTAsCiAgICAgICAgICAgICAgICAgIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0yNCksCiAgICAgICAgICAgICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTIwKSwKICAgICAgICAgICAgICAgICAgcGxvdC5tYXJnaW49dW5pdChjKDAsMC4yNSwwLDAuMjUpLHVuaXRzPSdsaW5lJyksCiAgICAgICAgICAgICAgICAgIHBhbmVsLnNwYWNpbmc9dW5pdChjKDAsMCwwLDApLHVuaXRzPSdsaW5lJykpCgpteV90aGVtZTIgPC0gdGhlbWUocGxvdC50aXRsZT1lbGVtZW50X3RleHQoaGp1c3Q9MC41LHNpemU9MzIsZmFjZT0nYm9sZCcpLAogICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0yNCksCiAgICAgICAgICAgICAgICAgICBheGlzLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MjApLAogICAgICAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIixhc3BlY3QucmF0aW89MSkKCmBgYAoKYGBge3J9CgpmaWdTXzFEIDwtIFZsblBsb3Qob2JqZWN0PXN1YnNldChuZXVyb24uaW50ZWdyYXRlZCxpZGVudHM9YygiVjJSX21WU04iKSksIAogICAgICAgIGZlYXR1cmVzPSJHbmFpMiIsIGdyb3VwLmJ5PSJvcmlnLmlkZW50IikgKwogIG15X3RoZW1lMiArIGdndGl0bGUoIkduYWkyIGluIE1hdHVyZSBWMlIgTmV1cm9ucyIpCmZpZ1NfMUQKCmBgYAoKIyMgRXhwcmVzc2lvbiBvZiBDbmdhMiBhbmQgR25hbCBpbiB0aGUgT1NOIGxpbmVhZ2UgIAoKYGBge3IsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD04fQoKZmlnMl9jIDwtIEZlYXR1cmVQbG90KG5ldXJvbi5pbnRlZ3JhdGVkLCBmZWF0dXJlcz1jKCJDbmdhMiIsIkduYWwiKSwgCiAgICAgICAgICAgIGNvbHM9YygiY3lhbjMiLCJtYWdlbnRhIiksIG9yZGVyPVRSVUUsIG5jb2w9MikgKwogIHRoZW1lKGFzcGVjdC5yYXRpbyA9IDEpCgpzdmdsaXRlKGZpbGVuYW1lID0gcGFzdGUwKGFkb2JlX2ltYWdlcywiZmlnMl9jLnN2ZyIpLCB3aWR0aD0xMCwgaGVpZ2h0PTUpCmZpZzJfYwppbnZpc2libGUoZGV2Lm9mZigpKQoKZmlnMl9jCgpgYGAKCiMjIExvY2F0aW9uIG9mIG1PU05zICAKCmBgYHtyfQoKZmlnMmQuc2FtcGxlcyA8LSByZXNvbHZlLmRhdGFzZXRzW1sic2xpZGU3LkIyXzIiXV0KCmBgYAoKYGBge3J9CgpmaWcyX09TTiA8LSBTcGF0aWFsRmVhdHVyZVBsb3QoZmlnMmQuc2FtcGxlcywgZmVhdHVyZXM9cm93bmFtZXMocmVzb2x2ZS5wcmVkaWN0aW9ucy5hc3NheSlbMTJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0LnNpemUuZmFjdG9yPTQsKSArIHRoZW1lKGFzcGVjdC5yYXRpbz0xLGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdD0wLjUsc2l6ZT0zNikpICsKICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdz0iZ3JleTg1IixoaWdoPSJtYWdlbnRhIikgKyBnZ3RpdGxlKCJtT1NOcyIpCgpzdmdsaXRlKGZpbGVuYW1lID0gcGFzdGUwKGFkb2JlX2ltYWdlcywiZmlnMl9PU04uc3ZnIiksIHdpZHRoPTksIGhlaWdodD05KQpmaWcyX09TTgppbnZpc2libGUoZGV2Lm9mZigpKQpmaWcyX09TTgoKYGBgCgojIyBUb3RhbCBudW1iZXIgb2YgZ2VuZXMsIGNvdW50cywgYW5kIHBlcmNlbnQgcmlib3NvbWFsIGdlbmUgZXhwcmVzc2lvbiBkZXRlY3RlZCBpbiBtYXR1cmUgbmV1cm9ucywgc3BsaXQgYnkgY2VsbCB0eXBlICAKCmBgYHtyLGZpZy53aWR0aD0xOCxmaWcuaGVpZ2h0PTZ9CgpmaWdTXzFFIDwtIGdncGxvdChzVlNOLmNvbXBhcmUuZGYsYWVzKHg9Y2VsbF90eXBlLHk9bkZlYXR1cmVfUk5BLGZpbGw9Y2VsbF90eXBlKSkgKyBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX21hbnVhbCgiQ2VsbCBUeXBlIix2YWx1ZXM9bWF0dXJlLmNlbGxfdHlwZS5jb2xvcnMpICsgdGhlbWVfY2xhc3NpYygpICsKICBzdGF0X3N1bW1hcnkoZnVuLnk9bWVhbixnZW9tPSdwb2ludCcsc2l6ZT0xMCxjb2xvdXI9ImJsYWNrIixzaGFwZT05NSxzaG93X2d1aWRlPUZBTFNFKSArCiAgc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zPW15X2NvbXBhcmlzb25zLHRpcC5sZW5ndGg9MC4wMSwKICAgICAgICAgICAgICAgICAgICAgbWV0aG9kPSJ3aWxjb3gudGVzdCIsbGFiZWw9InAuc2lnbmlmIix2anVzdD0wLjMpICsKICBnZ3RpdGxlKCJUb3RhbCBHZW5lcyIpICsgeWxhYigiY291bnQiKSArIG15X3RoZW1lICsgTm9MZWdlbmQoKQoKZmlnU18xRiA8LSBnZ3Bsb3Qoc1ZTTi5jb21wYXJlLmRmLGFlcyh4PWNlbGxfdHlwZSx5PW5Db3VudF9STkEsZmlsbD1jZWxsX3R5cGUpKSArIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKCJDZWxsIFR5cGUiLHZhbHVlcz1tYXR1cmUuY2VsbF90eXBlLmNvbG9ycykgKyB0aGVtZV9jbGFzc2ljKCkgKwogIHN0YXRfc3VtbWFyeShmdW4ueT1tZWFuLGdlb209J3BvaW50JyxzaXplPTEwLGNvbG91cj0iYmxhY2siLHNoYXBlPTk1LHNob3dfZ3VpZGU9RkFMU0UpICsKICBzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnM9bXlfY29tcGFyaXNvbnMsdGlwLmxlbmd0aD0wLjAxLAogICAgICAgICAgICAgICAgICAgICBtZXRob2Q9IndpbGNveC50ZXN0IixsYWJlbD0icC5zaWduaWYiLHZqdXN0PTAuMykgKwogIGdndGl0bGUoIlRvdGFsIENvdW50cyIpICsgeWxhYigiY291bnQiKSArIG15X3RoZW1lICsgTm9MZWdlbmQoKQoKZmlnU18xRyA8LSBnZ3Bsb3Qoc1ZTTi5jb21wYXJlLmRmLGFlcyh4PWNlbGxfdHlwZSx5PXBlcmNlbnQucmlibyxmaWxsPWNlbGxfdHlwZSkpICsgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF9tYW51YWwoIkNlbGwgVHlwZSIsdmFsdWVzPW1hdHVyZS5jZWxsX3R5cGUuY29sb3JzKSArIHRoZW1lX2NsYXNzaWMoKSArCiAgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sZ2VvbT0ncG9pbnQnLHNpemU9MTAsY29sb3VyPSJibGFjayIsc2hhcGU9OTUsc2hvd19ndWlkZT1GQUxTRSkgKwogIHN0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucz1teV9jb21wYXJpc29ucyx0aXAubGVuZ3RoPTAuMDEsCiAgICAgICAgICAgICAgICAgICAgIG1ldGhvZD0id2lsY294LnRlc3QiLGxhYmVsPSJwLnNpZ25pZiIsdmp1c3Q9MC4zKSArCiAgZ2d0aXRsZSgiUmlib3NvbWFsIChQZXJjZW50KSIpICsgeWxhYigicGVyY2VudCIpICsgbXlfdGhlbWUgKyBOb0xlZ2VuZCgpCgpnZ2FycmFuZ2UoZmlnU18xRSwgZmlnU18xRiwgZmlnU18xRywgbmNvbD0zLCBjb21tb24ubGVnZW5kPVRSVUUsIGxlZ2VuZD0iYm90dG9tIiwgYWxpZ249Imh2IikKCmBgYAoKIyMgTG9jYXRpb24gb2Ygc1ZTTnMgaW4gYSBWTk8gc2xpY2UgIAoKYGBge3J9CgpmaWcyX3NWU04gPC0gU3BhdGlhbEZlYXR1cmVQbG90KGZpZzJkLnNhbXBsZXMsIGZlYXR1cmVzPXJvd25hbWVzKHJlc29sdmUucHJlZGljdGlvbnMuYXNzYXkpWzVdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0LnNpemUuZmFjdG9yPTQsKSArIHRoZW1lKGFzcGVjdC5yYXRpbz0xLGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdD0wLjUsc2l6ZT0zNikpICsKICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdz0iZ3JleTg1IixoaWdoPSJtYWdlbnRhIikgKyBnZ3RpdGxlKCJzVlNOcyIpCgpzdmdsaXRlKGZpbGVuYW1lID0gcGFzdGUwKGFkb2JlX2ltYWdlcywiZmlnMl9zVlNOLnN2ZyIpLCB3aWR0aD05LCBoZWlnaHQ9OSkKZmlnMl9zVlNOCmludmlzaWJsZShkZXYub2ZmKCkpCmZpZzJfc1ZTTgoKYGBgCgojIyBIZWF0bWFwIG9mIG5vcm1hbGl6ZWQgZXhwcmVzc2lvbiBmb3IgYSBzZWxlY3Qgc2V0IG9mIG11dHVhbGx5IGRpZmZlcmVudGlhbGx5IGV4cHJlc3NlZCBnZW5lcyBiZXR3ZWVuIHNWU05zIGFuZCBtYXR1cmUgVjFScywgVjJScywgYW5kIE9TTnMgIAoKYGBge3J9CgpzdnNuLmdvaSA8LSBjKCJDc3BwMSIsIkQxMFdzdTEwMmUiLCJHbTE2NTc5IiwiTmVhdDEiLCJQMnJ5MTQiLCJSYm00YiIsIlduazEiLCJaZnA3MzgiLAogICAgICAgICAgICAgICJDb3g2YTEiLCJDb3g3YTIiLCJKdW5kIiwiTWFwMWxjM2IiLCJOZHVmYTIiLCJOZHVmYTciLCJPbXAiLCJQcnhsMmIiKQoKbVNOLm1hdHJpeCA8LSBHZXRBc3NheURhdGEoc3Vic2V0KG5ldXJvbi5pbnRlZ3JhdGVkLGlkZW50cz1jKCJWMVJfbVZTTiIsIlYyUl9tVlNOIiwibU9TTiIsInNWU04iKSksc2xvdD0nZGF0YScpCnNWU04udG9wLmRmIDwtIGFzLmRhdGEuZnJhbWUobVNOLm1hdHJpeFtzdnNuLmdvaSwgXSkKCiMgVGhlIGNlbGwgSURzIGZvciBBTEwgbWF0dXJlIHNlbnNvcnkgbmV1cm9ucwptYXR1cmUubmV1cm9uLmNlbGxJRHMgPC0gV2hpY2hDZWxscyhvYmplY3Q9bmV1cm9uLmludGVncmF0ZWQsIGlkZW50cz1jKCJWMVJfbVZTTiIsIlYyUl9tVlNOIiwibU9TTiIsInNWU04iKSkKIyBHZXQgY29ycmVzcG9uZGluZyBjZWxsLXR5cGUgbWV0YWRhdGEgZm9yIGNvbHVtbiBhbm5vdGF0aW9ucwptYXR1cmUubmV1cm9uLmFubm90YXRpb24gPC0gZGF0YS5mcmFtZShjZWxsX3R5cGU9bmV1cm9uLmludGVncmF0ZWRAbWV0YS5kYXRhW21hdHVyZS5uZXVyb24uY2VsbElEcyxjKCJjZWxsX3R5cGUiKSxkcm9wPUZBTFNFXSkKc3Zzbi5jZWxsLm9yZGVyIDwtIG9yZGVyKG1hdHVyZS5uZXVyb24uYW5ub3RhdGlvbiRjZWxsX3R5cGUpCm1hdHVyZS5uZXVyb24uYW5ub3RhdGlvbiA8LSBhcy5kYXRhLmZyYW1lKG1hdHVyZS5uZXVyb24uYW5ub3RhdGlvbltzdnNuLmNlbGwub3JkZXIsICxkcm9wPUZBTFNFXSkKc1ZTTi50b3AuZGYgPC0gc1ZTTi50b3AuZGZbICxzdnNuLmNlbGwub3JkZXJdCgpybShtU04ubWF0cml4LG1hdHVyZS5uZXVyb24uY2VsbElEcykKCmBgYAoKYGBge3IsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD04fQoKIyBDdXN0b20gUGFsZXR0ZSBmb3IgZ2VuZSBleHByZXNzaW9uCmNvbG9ycyA8LSBjKCIjMDA3RkZGIiwgIiMyRThCNTciLCAiI0ZGRkY2NiIsICIjRkZBNTAwIiwgIiNGRjAwMDAiKQpwYWxldHRlIDwtIGNvbG9yUmFtcFBhbGV0dGUoY29sb3JzKQoKIyBDdXN0b20gUGFsZXR0ZSBmb3IgQ2VsbCBUeXBlcwpmaWcyX2cucGFsZXR0ZSA8LXdlc2FuZGVyc29uOjp3ZXNfcGFsZXR0ZSgiRGFyamVlbGluZzEiKVsyOjVdCm5hbWVzKGZpZzJfZy5wYWxldHRlKSA8LSBjKCJWMVJfbVZTTiIsIlYyUl9tVlNOIiwibU9TTiIsInNWU04iKQoKIyBBbm5vdGF0aW9uIENvbG9yIFNjaGVtYXRpYyAKdnNuLmFubl9jb2xvcnMgPC0gbGlzdChjZWxsX3R5cGU9ZmlnMl9nLnBhbGV0dGUpCgpmaWcyX2cgPC0gcGhlYXRtYXAobWF0PXNWU04udG9wLmRmLCAKICAgICAgICAgICAgICAgICAgIGNvbG9yPXBhbGV0dGUobj01MCksIGZvbnRzaXplPTEwLCB0cmVlaGVpZ2h0X2NvbCA9IDAsCiAgICAgICAgICAgICAgICAgICBjbHVzdGVyX3Jvd3M9VFJVRSwgY2x1c3Rlcl9jb2xzPUZBTFNFLCAjc2NhbGU9InJvdyIsIAogICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbl9jb2w9bWF0dXJlLm5ldXJvbi5hbm5vdGF0aW9uLCBzaG93X2NvbG5hbWVzPUZBTFNFLAogICAgICAgICAgICAgICAgICAgc2hvd19yb3duYW1lcz1UUlVFLCBhbm5vdGF0aW9uX2NvbG9ycz12c24uYW5uX2NvbG9ycykKCmBgYAoKIyMgSGVhdG1hcCBvZiA1MDMgc2lnbmlmaWNhbnQgKHBhZGog4omkIDAuMDAxLCBmb2xkLWNoYW5nZSDiiaUgMS41KSBkaWZmZXJlbnRpYWxseSBleHByZXNzZWQgZ2VuZXMgaW4gc1ZTTnMgIAoKYGBge3J9CgojIFRoZSBnZW5lIG5hbWVzIGZvciBzVlNOIHNpZ25pZmljYW50bHkgdXAtcmVndWxhdGVkIGdlbmVzIGFnYWluc3QgVjFSL1YyUiBWU05zIGFuZCBPU05zCnNWU05fT1NOLnVwX2dlbmVzIDwtIHJvd25hbWVzKHVua25vd25fbVZTTl9tT1NOLkRFR3NbdW5rbm93bl9tVlNOX21PU04uREVHcyRwX3ZhbF9hZGogPCAwLjAwMSAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duX21WU05fbU9TTi5ERUdzJGF2Z19sb2cyRkMgPiBsb2cyKDEuNSksIF0pCnNWU05fVjFSLnVwX2dlbmVzIDwtIHJvd25hbWVzKHVua25vd25fbVZTTl9WMVJfbVZTTi5ERUdzW3Vua25vd25fbVZTTl9WMVJfbVZTTi5ERUdzJHBfdmFsX2FkaiA8IDAuMDAxICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93bl9tVlNOX1YxUl9tVlNOLkRFR3MkYXZnX2xvZzJGQyA+IGxvZzIoMS41KSwgXSkKc1ZTTl9WMlIudXBfZ2VuZXMgPC0gcm93bmFtZXModW5rbm93bl9tVlNOX1YyUl9tVlNOLkRFR3NbdW5rbm93bl9tVlNOX1YyUl9tVlNOLkRFR3MkcF92YWxfYWRqIDwgMC4wMDEgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVua25vd25fbVZTTl9WMlJfbVZTTi5ERUdzJGF2Z19sb2cyRkMgPiBsb2cyKDEuNSksIF0pCgpzVlNOLnVwX2dlbmVzIDwtIGludGVyc2VjdChzVlNOX09TTi51cF9nZW5lcywgaW50ZXJzZWN0KHNWU05fVjFSLnVwX2dlbmVzLCBzVlNOX1YyUi51cF9nZW5lcykpCgpzVlNOX09TTi5kb3duX2dlbmVzIDwtIHJvd25hbWVzKHVua25vd25fbVZTTl9tT1NOLkRFR3NbdW5rbm93bl9tVlNOX21PU04uREVHcyRwX3ZhbF9hZGogPCAwLjAwMSAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duX21WU05fbU9TTi5ERUdzJGF2Z19sb2cyRkMgPCAtbG9nMigxLjUpLCBdKQpzVlNOX1YxUi5kb3duX2dlbmVzIDwtIHJvd25hbWVzKHVua25vd25fbVZTTl9WMVJfbVZTTi5ERUdzW3Vua25vd25fbVZTTl9WMVJfbVZTTi5ERUdzJHBfdmFsX2FkaiA8IDAuMDAxICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93bl9tVlNOX1YxUl9tVlNOLkRFR3MkYXZnX2xvZzJGQyA8IC1sb2cyKDEuNSksIF0pCnNWU05fVjJSLmRvd25fZ2VuZXMgPC0gcm93bmFtZXModW5rbm93bl9tVlNOX1YyUl9tVlNOLkRFR3NbdW5rbm93bl9tVlNOX1YyUl9tVlNOLkRFR3MkcF92YWxfYWRqIDwgMC4wMDEgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVua25vd25fbVZTTl9WMlJfbVZTTi5ERUdzJGF2Z19sb2cyRkMgPCAtbG9nMigxLjUpLCBdKQoKc1ZTTi5kb3duX2dlbmVzIDwtIGludGVyc2VjdChzVlNOX09TTi5kb3duX2dlbmVzLCBpbnRlcnNlY3Qoc1ZTTl9WMVIuZG93bl9nZW5lcywgc1ZTTl9WMlIuZG93bl9nZW5lcykpCgojIEhvdyBtYW55IHVuaXZlcnNhbGx5IHNpZ25pZmljYW50IHJlZ3VsYXRlZCBnZW5lcyBpbiBzVlNOcyB3aGVuIGNvbXBhcmVkIGFnYWluc3Qgb3RoZXIgbWF0dXJlIG5ldXJvbiB0eXBlcwpwcmludCgic1ZTTiBTaWduaWZpY2FudCBVcHJlZ3VsYXRlZCBHZW5lcyIpCmxlbmd0aChzVlNOLnVwX2dlbmVzKQpwcmludCgic1ZTTiBTaWduaWZpY2FudCBEb3ducmVndWxhdGVkIEdlbmVzIikKbGVuZ3RoKHNWU04uZG93bl9nZW5lcykKCmFsbC5zdnNuLmRlZ3MgPC0gYyhzVlNOLnVwX2dlbmVzLHNWU04uZG93bl9nZW5lcykKCmBgYAoKYGBge3J9CgojIEdldCBjb3VudCBkYXRhIGZvciBtYXR1cmUgc2Vuc29yeSBuZXVyb25zCm1TTi5tYXRyaXggPC0gR2V0QXNzYXlEYXRhKHN1YnNldChuZXVyb24uaW50ZWdyYXRlZCxpZGVudHM9YygiVjFSX21WU04iLCJWMlJfbVZTTiIsIm1PU04iLCJzVlNOIiksZG93bnNhbXBsZT00MDApLHNsb3Q9J2RhdGEnKQojIFN1YnNldCB0aGUgbWF0cml4IGZvciBvdXIgc1ZTTiBERUdzCnNWU04udG9wLmRmIDwtIGFzLmRhdGEuZnJhbWUobVNOLm1hdHJpeFthbGwuc3Zzbi5kZWdzLCBdKQoKIyBUaGUgY2VsbCBJRHMgZm9yIEFMTCBtYXR1cmUgc2Vuc29yeSBuZXVyb25zCm1hdHVyZS5uZXVyb24uY2VsbElEcyA8LSBjb2xuYW1lcyhzVlNOLnRvcC5kZikKIyBHZXQgY29ycmVzcG9uZGluZyBjZWxsLXR5cGUgbWV0YWRhdGEgZm9yIGNvbHVtbiBhbm5vdGF0aW9ucwptYXR1cmUubmV1cm9uLmFubm90YXRpb24gPC0gZGF0YS5mcmFtZShjZWxsX3R5cGU9bmV1cm9uLmludGVncmF0ZWRAbWV0YS5kYXRhW21hdHVyZS5uZXVyb24uY2VsbElEcyxjKCJjZWxsX3R5cGUiKV0pCnJvd25hbWVzKG1hdHVyZS5uZXVyb24uYW5ub3RhdGlvbikgPC0gY29sbmFtZXMoc1ZTTi50b3AuZGYpCgpybShtU04ubWF0cml4LG1hdHVyZS5uZXVyb24uY2VsbElEcykKCmBgYAoKYGBge3J9CgojIEN1c3RvbSBQYWxldHRlIGZvciBnZW5lIGV4cHJlc3Npb24KY29sb3JzIDwtIGMoIiMwMDdGRkYiLCAiIzJFOEI1NyIsICIjRkZGRjY2IiwgIiNGRkE1MDAiLCAiI0ZGMDAwMCIpCnBhbGV0dGUgPC0gY29sb3JSYW1wUGFsZXR0ZShjb2xvcnMpCgojIEN1c3RvbSBQYWxldHRlIGZvciBDZWxsIFR5cGVzCmZpZ1NfNC5wYWxldHRlIDwtd2VzYW5kZXJzb246Ondlc19wYWxldHRlKCJEYXJqZWVsaW5nMSIpWzI6NV0KbmFtZXMoZmlnU180LnBhbGV0dGUpIDwtIGMoIlYxUl9tVlNOIiwiVjJSX21WU04iLCJtT1NOIiwic1ZTTiIpCgojIEFubm90YXRpb24gQ29sb3IgU2NoZW1hdGljIAp2c24uYW5uX2NvbG9ycyA8LSBsaXN0KGNlbGxfdHlwZT1maWdTXzQucGFsZXR0ZSkKCmZpZ1NfNCA8LSBwaGVhdG1hcChtYXQ9c1ZTTi50b3AuZGYsIAogICAgICAgICAgICAgICAgICAgY29sb3I9cGFsZXR0ZShuPTUwKSwgZm9udHNpemU9OCwgdHJlZWhlaWdodF9jb2w9MCwgY2VsbHdpZHRoID0gMC4zNywKICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJfcm93cz1UUlVFLCBjbHVzdGVyX2NvbHM9VFJVRSwgdHJlZWhlaWdodF9yb3c9MjUsIGNlbGxoZWlnaHQgPSAxLjMsCiAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uX2NvbD1tYXR1cmUubmV1cm9uLmFubm90YXRpb24sIHNob3dfY29sbmFtZXM9RkFMU0UsCiAgICAgICAgICAgICAgICAgICBzaG93X3Jvd25hbWVzPUZBTFNFLCBhbm5vdGF0aW9uX2NvbG9ycz12c24uYW5uX2NvbG9ycywKICAgICAgICAgICAgICAgICAgIG1haW49IlNpZ25pZmljYW50IERpZmZlcmVudGlhbGx5IEV4cHJlc3NlZCBHZW5lcyBpbiBzVlNOcyIpCgpgYGAKCiMjIEVucmljaGVkIGdlbmUgb250b2xvZ3kgKEdPKSB0ZXJtcyBpbiBzVlNOcyB3aGVuIGNvbXBhcmVkIHdpdGggVjFSIGFuZCBWMlIgVlNOcywgcmVzcGVjdGl2ZWx5ICAKCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQoKIyBDb21iaW5lZCBHTyBSZXN1bHRzIGZvciBVbmtub3duIG1WU05zIFZTIFYxUnMKdW5rbm93bl9tVlNOX1ZfVjFSLkdPIDwtIHJiaW5kKHVua25vd25fbVZTTl9WMVJfbVZTTi5CUC5yZXMsdW5rbm93bl9tVlNOX1YxUl9tVlNOLk1GLnJlcyx1bmtub3duX21WU05fVjFSX21WU04uQ0MucmVzKQojIFJlbW92ZSBOQXMKdW5rbm93bl9tVlNOX1ZfVjFSLkdPIDwtIG5hLm9taXQodW5rbm93bl9tVlNOX1ZfVjFSLkdPKQojIEp1c3Qgc2lnbmlmaWNhbnQgcmVzdWx0cwp1bmtub3duX21WU05fVl9WMVIuR08gPC0gdW5rbm93bl9tVlNOX1ZfVjFSLkdPW3Vua25vd25fbVZTTl9WX1YxUi5HTyRwYWRqIDw9IDAuMDUsIF0KIyBDcmVhdGUgYSBjb2x1bW4gZm9yIEdPIGNhdGVnb3J5CnVua25vd25fbVZTTl9WX1YxUi5HTyRDYXRlZ29yeSA8LSBzdWJzdHJpbmcodW5rbm93bl9tVlNOX1ZfVjFSLkdPJHBhdGh3YXksZmlyc3Q9MyxsYXN0PTQpCnVua25vd25fbVZTTl9WX1YxUi5HTyRwYXRod2F5IDwtIHN1YnN0cmluZyh1bmtub3duX21WU05fVl9WMVIuR08kcGF0aHdheSxmaXJzdD02KQojIE9yZGVyIGJ5IG5vcm1hbGl6ZWQgZW5yaWNobWVudCBzY29yZQp1bmtub3duX21WU05fVl9WMVIuR08gPC0gdW5rbm93bl9tVlNOX1ZfVjFSLkdPW29yZGVyKHVua25vd25fbVZTTl9WX1YxUi5HTyRORVMpLCBdCnVua25vd25fbVZTTl9WX1YxUi5HTyRwYXRod2F5IDwtIGZhY3Rvcih1bmtub3duX21WU05fVl9WMVIuR08kcGF0aHdheSwgbGV2ZWxzPXVua25vd25fbVZTTl9WX1YxUi5HTyRwYXRod2F5KQoKIyBDb21iaW5kIEdPIFJlc3VsdHMgZm9yIFVua25vd24gbVZTTnMgVlMgVjJScwp1bmtub3duX21WU05fVl9WMlIuR08gPC0gcmJpbmQodW5rbm93bl9tVlNOX1YyUl9tVlNOLkJQLnJlcyx1bmtub3duX21WU05fVjJSX21WU04uTUYucmVzLHVua25vd25fbVZTTl9WMlJfbVZTTi5DQy5yZXMpCiMgUmVtb3ZlIE5Bcwp1bmtub3duX21WU05fVl9WMlIuR08gPC0gbmEub21pdCh1bmtub3duX21WU05fVl9WMlIuR08pCiMgSnVzdCBzaWduaWZpY2FudCByZXN1bHRzCnVua25vd25fbVZTTl9WX1YyUi5HTyA8LSB1bmtub3duX21WU05fVl9WMlIuR09bdW5rbm93bl9tVlNOX1ZfVjJSLkdPJHBhZGogPD0gMC4wNSwgXQojIENyZWF0ZSBhIGNvbHVtbiBmb3IgR08gY2F0ZWdvcnkKdW5rbm93bl9tVlNOX1ZfVjJSLkdPJENhdGVnb3J5IDwtIHN1YnN0cmluZyh1bmtub3duX21WU05fVl9WMlIuR08kcGF0aHdheSxmaXJzdD0zLGxhc3Q9NCkgCnVua25vd25fbVZTTl9WX1YyUi5HTyRwYXRod2F5IDwtIHN1YnN0cmluZyh1bmtub3duX21WU05fVl9WMlIuR08kcGF0aHdheSxmaXJzdD02KQojIFNvcnQgYnkgbm9ybWFsaXplZCBlbnJpY2htZW50IHNjb3JlCnVua25vd25fbVZTTl9WX1YyUi5HTyA8LSB1bmtub3duX21WU05fVl9WMlIuR09bb3JkZXIodW5rbm93bl9tVlNOX1ZfVjJSLkdPJE5FUyksIF0KdW5rbm93bl9tVlNOX1ZfVjJSLkdPJHBhdGh3YXkgPC0gZmFjdG9yKHVua25vd25fbVZTTl9WX1YyUi5HTyRwYXRod2F5LCBsZXZlbHM9dW5rbm93bl9tVlNOX1ZfVjJSLkdPJHBhdGh3YXkpCgpgYGAKCmBgYHtyfQoKIyBSZW1vdmUgR08tVGVybXMgd2l0aCAxMDAwIG9yIG1vcmUgYXNzb2NpYXRlZCBnZW5lcwp1bmtub3duX21WU05fVl9WMVIuR08gPC0gdW5rbm93bl9tVlNOX1ZfVjFSLkdPW3Vua25vd25fbVZTTl9WX1YxUi5HTyRzaXplIDwgMTAwMCwgXQp1bmtub3duX21WU05fVl9WMlIuR08gPC0gdW5rbm93bl9tVlNOX1ZfVjJSLkdPW3Vua25vd25fbVZTTl9WX1YyUi5HTyRzaXplIDwgMTAwMCwgXQoKIyBUZXJtcyB0byByZW1vdmUgCnYxci5nby5yZW1vdmUgPC0gYygiRVNUQUJMSVNITUVOVF9PRl9QUk9URUlOX0xPQ0FMSVpBVElPTl9UT19PUkdBTkVMTEUiKQp2MnIuZ28ucmVtb3ZlIDwtIGMoIlJJQk9TT01BTF9TVUJVTklUIiwiUklCT1NPTUUiKQoKdW5rbm93bl9tVlNOX1ZfVjFSLkdPIDwtIHVua25vd25fbVZTTl9WX1YxUi5HT1t1bmtub3duX21WU05fVl9WMVIuR08kcGF0aHdheSE9djFyLmdvLnJlbW92ZSwgXQp1bmtub3duX21WU05fVl9WMlIuR08gPC0gdW5rbm93bl9tVlNOX1ZfVjJSLkdPW3Vua25vd25fbVZTTl9WX1YyUi5HTyRwYXRod2F5IT12MnIuZ28ucmVtb3ZlLCBdCgpgYGAKCmBgYHtyfQoKZmlnMl9lLnBhcnQxIDwtIGdncGxvdCh1bmtub3duX21WU05fVl9WMVIuR08sIGFlcyh4PXBhdGh3YXkseT1ORVMsZmlsbD1DYXRlZ29yeSkpICsKICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIpICsKICB0aGVtZShhc3BlY3QucmF0aW8gPSAxLHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiKSkgKwogIGdndGl0bGUoIkVucmljaGVkIEdPIFRlcm1zOiBzVlNOcyB2cyBWMVIgbVZTTnMiKSArCiAgeGxhYigiR08gVGVybSIpICsKICBjb29yZF9mbGlwKCkKCmBgYAoKYGBge3J9CgpmaWcyX2UucGFydDIgPC0gZ2dwbG90KHVua25vd25fbVZTTl9WX1YyUi5HTywgYWVzKHg9cGF0aHdheSx5PU5FUyxmaWxsPUNhdGVnb3J5KSkgKwogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikgKwogIHRoZW1lKGFzcGVjdC5yYXRpbyA9IDEscGxvdC50aXRsZT1lbGVtZW50X3RleHQoZmFjZT0iYm9sZCIpKSArCiAgZ2d0aXRsZSgiRW5yaWNoZWQgR08gVGVybXMgaW4gc1ZTTnMgdnMgVjJSIG1WU05zIikgKwogIHhsYWIoIkdPIFRlcm0iKSArCiAgY29vcmRfZmxpcCgpCgpgYGAKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CgpmaWcyX2UgPC0gZ2dhcnJhbmdlKHBsb3RsaXN0PWxpc3QoVjFSPWZpZzJfZS5wYXJ0MSxWMlI9ZmlnMl9lLnBhcnQyKSwgbnJvdz0yLCBuY29sPTEsIAogICAgICAgICAgICAgICAgICAgIGNvbW1vbi5sZWdlbmQ9VFJVRSwgYWxpZ24gPSAiaHYiLCBsZWdlbmQgPSAicmlnaHQiKSArCiAgdGhlbWUoYXNwZWN0LnJhdGlvPTEpCgpzdmdsaXRlKGZpbGVuYW1lID0gcGFzdGUwKGFkb2JlX2ltYWdlcywiZmlnMl9lLnN2ZyIpLHdpZHRoPTgsaGVpZ2h0PTgpCmZpZzJfZQppbnZpc2libGUoZGV2Lm9mZigpKQoKYGBgCgpgYGB7cn0KCmZpZzJfZQoKYGBgCgojIyBCb3ggcGxvdHMgb2Ygbm9ybWFsaXplZCBleHByZXNzaW9uIGZvciBNdWMyLCBPYnAyYSwgT2JwMmIsIGFuZCBMY24zIGFjcm9zcyBtYXR1cmUgc2Vuc29yeSBuZXVyb25zICAKCmBgYHtyfQoKbXlfdGhlbWVfMiA8LSB0aGVtZShheGlzLnRpdGxlLnk9ZWxlbWVudF90ZXh0KHNpemU9MjApLCAgICAgICAgICAgICAjY2hhbmdlIGZvbnQgc2l6ZSBvZiB5IGF4aXMgbGFiZWwKICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpLCAgICAgICAgICAgICAgICAgICAjZG9uJ3Qgc2hvdyB4IGF4aXMgbGFiZWwKICAgICAgICAgICAgICAgICAgICBwbG90LnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTMyLGhqdXN0PTAuNSksICAgICAjY2hhbmdlIGZvbnQgc2l6ZSBvZiBwbG90IHRpdGxlLCBjZW50ZXIKICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MjQpLCAgICAgICAgICAgICAjY2hhbmdlIGZvbnQgc2l6ZSBvZiBsZWdlbmQgdGl0bGUKICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0yMCksICAgICAgICAgICAgICAjY2hhbmdlIGZvbnQgc2l6ZSBvZiBsZWdlbmQgdGV4dAogICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPTIwKSwgICAgICAgICAgICAgICNjaGFuZ2UgZm9udCBzaXplIG9mIGF4aXMgdGljayBsYWJlbHMKICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X2JsYW5rKCksICAgICAgICAgICAgICAgICAgICAjZG9uJ3Qgc2hvdyB4LWF4aXMgdGljayBsYWJlbHMKICAgICAgICAgICAgICAgICAgICBheGlzLnRpY2tzLng9ZWxlbWVudF9ibGFuaygpLCAgICAgICAgICAgICAgICAgICAjZG9uJ3Qgc2hvdyB4LWF4aXMgdGlja3MKICAgICAgICAgICAgICAgICAgICBsZWdlbmQua2V5LnNpemU9dW5pdCg4LCdtbScpLCAgICAgICAgICAgICAgICAgICAjdGhlIHNpemUgb2YgbGVnZW5kICdib3hlcycKICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGl0bGUuYWxpZ249MCwgICAgICAgICAgICAgICAgICAgICAgICAgICAjbGVmdCBhbGlnbiBsZWdlbmQgdGl0bGUKICAgICAgICAgICAgICAgICAgICBhc3BlY3QucmF0aW89MSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAja2VlcCBwbG90cyBzcXVhcmUKCmBgYAoKYGBge3J9CgpwMSA8LSBnZ3Bsb3Qoc1ZTTi5jb21wYXJlLmRmLGFlcyh4PWNlbGxfdHlwZSx5PU11YzIsZmlsbD1jZWxsX3R5cGUpKSArIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX21hbnVhbCgiQ2VsbCBUeXBlIix2YWx1ZXM9bWF0dXJlLmNlbGxfdHlwZS5jb2xvcnMpICsgdGhlbWVfY2xhc3NpYygpICsKICBzdGF0X3N1bW1hcnkoZnVuLnk9bWVhbixnZW9tPSdwb2ludCcsc2l6ZT0yMCxjb2xvdXI9ImJsYWNrIixzaGFwZT05NSxzaG93X2d1aWRlPUZBTFNFKSArCiAgc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zPW15X2NvbXBhcmlzb25zLHRpcC5sZW5ndGg9MC4wMSwKICAgICAgICAgICAgICAgICAgICAgbWV0aG9kPSJ3aWxjb3gudGVzdCIsbGFiZWw9InAuc2lnbmlmIix2anVzdD0wLjMpICsKICBnZ3RpdGxlKCJNdWMyIikgKyB5bGFiKCJub3JtYWxpemVkIGNvdW50IikgKyBteV90aGVtZV8yCnAyIDwtIGdncGxvdChzVlNOLmNvbXBhcmUuZGYsYWVzKHg9Y2VsbF90eXBlLHk9T2JwMmEsZmlsbD1jZWxsX3R5cGUpKSArIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX21hbnVhbCgiQ2VsbCBUeXBlIix2YWx1ZXM9bWF0dXJlLmNlbGxfdHlwZS5jb2xvcnMpICsgdGhlbWVfY2xhc3NpYygpICsKICBzdGF0X3N1bW1hcnkoZnVuLnk9bWVhbixnZW9tPSdwb2ludCcsc2l6ZT0yMCxjb2xvdXI9ImJsYWNrIixzaGFwZT05NSxzaG93X2d1aWRlPUZBTFNFKSArCiAgc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zPW15X2NvbXBhcmlzb25zLHRpcC5sZW5ndGg9MC4wMSwKICAgICAgICAgICAgICAgICAgICAgbWV0aG9kPSJ3aWxjb3gudGVzdCIsbGFiZWw9InAuc2lnbmlmIix2anVzdD0wLjMpICsKICBnZ3RpdGxlKCJPYnAyYSIpICsgeWxhYigibm9ybWFsaXplZCBjb3VudCIpICsgbXlfdGhlbWVfMgpwMyA8LSBnZ3Bsb3Qoc1ZTTi5jb21wYXJlLmRmLGFlcyh4PWNlbGxfdHlwZSx5PU9icDJiLGZpbGw9Y2VsbF90eXBlKSkgKyBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF9tYW51YWwoIkNlbGwgVHlwZSIsdmFsdWVzPW1hdHVyZS5jZWxsX3R5cGUuY29sb3JzKSArIHRoZW1lX2NsYXNzaWMoKSArCiAgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sZ2VvbT0ncG9pbnQnLHNpemU9MjAsY29sb3VyPSJibGFjayIsc2hhcGU9OTUsc2hvd19ndWlkZT1GQUxTRSkgKwogIHN0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucz1teV9jb21wYXJpc29ucyx0aXAubGVuZ3RoPTAuMDEsCiAgICAgICAgICAgICAgICAgICAgIG1ldGhvZD0id2lsY294LnRlc3QiLGxhYmVsPSJwLnNpZ25pZiIsdmp1c3Q9MC4zKSArCiAgZ2d0aXRsZSgiT2JwMmIiKSArIHlsYWIoIm5vcm1hbGl6ZWQgY291bnQiKSArIG15X3RoZW1lXzIKcDQgPC0gZ2dwbG90KHNWU04uY29tcGFyZS5kZixhZXMoeD1jZWxsX3R5cGUseT1MY24zLGZpbGw9Y2VsbF90eXBlKSkgKyBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF9tYW51YWwoIkNlbGwgVHlwZSIsdmFsdWVzPW1hdHVyZS5jZWxsX3R5cGUuY29sb3JzKSArIHRoZW1lX2NsYXNzaWMoKSArCiAgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sZ2VvbT0ncG9pbnQnLHNpemU9MjAsY29sb3VyPSJibGFjayIsc2hhcGU9OTUsc2hvd19ndWlkZT1GQUxTRSkgKwogIHN0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucz1teV9jb21wYXJpc29ucyx0aXAubGVuZ3RoPTAuMDEsCiAgICAgICAgICAgICAgICAgICAgIG1ldGhvZD0id2lsY294LnRlc3QiLGxhYmVsPSJwLnNpZ25pZiIsdmp1c3Q9MC4zKSArCiAgZ2d0aXRsZSgiTGNuMyIpICsgeWxhYigibm9ybWFsaXplZCBjb3VudCIpICsgbXlfdGhlbWVfMgoKZmlnMl9mIDwtIGdnYXJyYW5nZShwMSxwMixwMyxwNCxuY29sPTIsbnJvdz0yLGNvbW1vbi5sZWdlbmQ9VFJVRSxhbGlnbj0iaHYiLGxlZ2VuZD0iYm90dG9tIikKICAKYGBgCgpgYGB7cn0KCnN2Z2xpdGUoZmlsZW5hbWUgPSBwYXN0ZTAoYWRvYmVfaW1hZ2VzLCJmaWcyX2Yuc3ZnIiksIHdpZHRoPTEwLCBoZWlnaHQ9MTApCmZpZzJfZgppbnZpc2libGUoZGV2Lm9mZigpKQoKYGBgCgpgYGB7cn0KCmZpZzJfZgoKYGBgCgojIyBTaWduaWZpY2FudGx5IHJlZ3VsYXRlZCBnZW5lcyBpbiBzVlNOcyAgCgo+VGhlIHNWU05zIGFyZSBkaXN0aW5jdGl2ZSBmcm9tIHRoZSBtYXR1cmUgVlNOcyBieSBhIGhpZ2hlciBleHByZXNzaW9uIG9mIFAycnkxNCwgQXAxczMsIENzcHAxLCBhbmQgbG93ZXIgZXhwcmVzc2lvbiBvZiBPbXAsIFR1YmExYSwgYW5kIFB0bWEgKEZpZy4gMmYgYW5kIFM2KS4KCmBgYHtyLCBmaWcud2lkdGg9MTUsIGZpZy5oZWlnaHQ9MTh9CgpzdnNuLmdvaSA8LSBjKCJNdWMyIiwiT2JwMmEiLCJPYnAyYiIsIkxjbjMiLAogICAgICAgICAgICAgICJXbmsxIiwiTmVhdDEiLCJQMnJ5MTQiLCJaZnA3MzgiLAogICAgICAgICAgICAgICJDc3BwMSIsIlJibTRiIiwiR20xNjU3OSIsIkQxMFdzdTEwMmUiLAogICAgICAgICAgICAgICJPbXAiLCJKdW5kIiwiTmR1ZmEyIiwiTmR1ZmE3IiwKICAgICAgICAgICAgICAiQ294NmExIiwiQ294N2EyIiwiTWFwMWxjM2IiLCJQcnhsMmIiKQoKZmlnU18zIDwtIEZlYXR1cmVQbG90KG5ldXJvbi5pbnRlZ3JhdGVkLCBmZWF0dXJlcz1zdnNuLmdvaSwgCiAgICAgICAgICAgIGNvbHM9YygiY3lhbjMiLCJtYWdlbnRhIiksIG5jb2w9NCwgb3JkZXI9VFJVRSkgJgogIHRoZW1lKGFzcGVjdC5yYXRpbyA9IDEsCiAgICAgICAgdGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xMCksCiAgICAgICAgcGxvdC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xNiksCiAgICAgICAgYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xMikpCgpzdmdsaXRlKGZpbGVuYW1lID0gcGFzdGUwKGFkb2JlX2ltYWdlcywiZmlnU18zLnN2ZyIpLCB3aWR0aD0xNSwgaGVpZ2h0PTE4KQpmaWdTXzMKaW52aXNpYmxlKGRldi5vZmYoKSkKCmZpZ1NfMwoKYGBgCgo=